package main

import (
	"fmt"
	"io"
	"net"
	"os"
)

func HandleError2(info string, err error) {
	if err != nil {
		fmt.Println(info, " err", err)
		os.Exit(2)
	}
}
func main() {
	args := os.Args
	//提取文件的绝对路径
	if len(args) != 2 {
		fmt.Println("格式为：go run xxx.go 文件名")
		return
	}
	//提取文件的绝对路径
	path := args[1]
	//提取文件名
	fileInfo, err := os.Stat(path)
	HandleError2("os.Stat", err)
	fileName := fileInfo.Name()
	//主动发起连接请求
	conn, err := net.Dial("tcp", "127.0.0.1:8008")
	HandleError2("Di", err)
	defer conn.Close()

	//发送文件名到接收端
	_, err1 := conn.Write([]byte(fileName))
	HandleError2("write", err1)

	//读取服务器会发的ok
	buf := make([]byte, 4096)
	n, err := conn.Read(buf)
	HandleError2("Read", err)
	if "ok" == string(buf[:n]) {
		//写文件内容给服务器——借助conn
		sendFile(conn, path)
	}

}

func sendFile(conn net.Conn, path string) {
	//之都打开文件
	f, err := os.Open(path)
	HandleError2("open", err)
	defer f.Close()

	//从本地文件中，读数据写给网络接收端，读多少，写多少
	buf := make([]byte, 4096)
	for {
		n, err := f.Read(buf)
		if err != nil {
			if err != io.EOF {
				fmt.Println("发送文件完成")
			} else {
				return
			}
			return
		}
		//写到网络socket中
		_, err1 := conn.Write(buf[:n])
		HandleError2("write", err1)
	}
}
